package dtdrelacional;

import java.util.*;
import java.util.ArrayList;

public class TablaSQL {

  private String nombre;
  private HashMap<String, ColumnaSQL> columnas;
  private ArrayList<HashMap<String, String>> filas;

  public TablaSQL(String nombre) {
    this.nombre = nombre;
    this.columnas = new HashMap<String, ColumnaSQL>();
    this.filas = new ArrayList<HashMap<String, String>>();
  }

  public String getNombre() {
    return nombre;
  }

  public void setNombre(String nombre) {
    this.nombre = nombre;
  }

  public void addColumna(ColumnaSQL columna) {
    this.columnas.put(columna.getNombre(), columna);
  }

  public boolean hasColumna(String nonmbreColumna) {
    return this.columnas.containsKey(nonmbreColumna);
  }

  public HashSet<ColumnaSQL> getColumnasRequeridas() {
    HashSet<ColumnaSQL> requeridas = new HashSet<ColumnaSQL>();

    Iterator<ColumnaSQL> ite = columnas.values().iterator();
    ColumnaSQL columna;
    while (ite.hasNext()) {
      columna = ite.next();
      if (columna.isRequerida()) {
        requeridas.add(columna);
      }
    }
    return requeridas;
  }
  
  public HashSet<ColumnaSQL> getColumnasPrimarias() {
    HashSet<ColumnaSQL> primarias = new HashSet<ColumnaSQL>();

    Iterator<ColumnaSQL> ite = columnas.values().iterator();
    ColumnaSQL columna;
    while (ite.hasNext()) {
      columna = ite.next();
      if (columna.isPrimaria()) {
        primarias.add(columna);
      }
    }
    return primarias;
  }
  
  public HashSet<ColumnaSQL> getColumnasForaneasATabla(String tablaForanea) {
    HashSet<ColumnaSQL> primarias = new HashSet<ColumnaSQL>();

    Iterator<ColumnaSQL> ite = columnas.values().iterator();
    ColumnaSQL columna;
    while (ite.hasNext()) {
      columna = ite.next();
      if (columna.getDatosForanea() != null) {
        if (columna.getDatosForanea()[0].equals(tablaForanea)) {
          primarias.add(columna);
        }
      }
    }
    return primarias;
  }

  public Collection<ColumnaSQL> getColumnas() {
    return this.columnas.values();
  }
  
  public ArrayList<String> getNombresTablasForaneas() {
    ArrayList<String> tablasForaneas = new ArrayList<String>();
    
    Iterator<ColumnaSQL> ite = columnas.values().iterator();
    ColumnaSQL columna;
    while (ite.hasNext()) {
      columna = ite.next();
      if (columna.getDatosForanea() != null) {
        tablasForaneas.add(columna.getDatosForanea()[0]);
      }
    }
    
    return tablasForaneas;
  }

  /**
   * Retorna true si el valor ya esta incluido en la tabla
   *
   * @param valor El valor a chequear
   */
  public boolean hasFila(HashMap<String, String> fila) {
    return filas.contains(fila);
  }

  public HashMap<String, String> getFilaConClave(String columnaClave, String clave) {
    Iterator<HashMap<String, String>> iteFilas = filas.iterator();
    HashMap<String, String> fila;
    while (iteFilas.hasNext()) {
      fila = iteFilas.next();
      if (fila.get(columnaClave).equals(clave)) {
        return fila;
      }
    }
    return null;
  }

  /**
   * Agrega un nuevo valor en la tabla
   * 
   * @param valor El valor a agregar
   */
  public void addFila(HashMap<String, String> fila) {
    filas.add(fila);
  }

  /**
   * @return the filas
   */
  public ArrayList<HashMap<String, String>> getFilas() {
    return filas;
  }
}
